<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var add=function(a,b){// 其实是个匿名函数
            return a+b;
        }
        // 1. 方法调用模式
        var myObject={
            value:0,
            increment:function(inc){
                this.value+=typeof inc==='number'? inc :1;
            },
            getValue(){
                return this.value;
            }
        };
        myObject.increment();
        document.writeln(myObject.value);// 1
        myObject.increment(2);
        document.writeln(myObject.value);// 3
        // 2.函数调用模式
        var sum=add(3,4);// 7
        myObject.double=function(){
            var that=this;// 修改this被绑定到外部
            var helper=function(){
                that.value=add(that.value,that.value);
            };
            helper();// 以函数的形式调用helper
            // console.log(that.value);
        };
        myObject.double();//方法调用
        document.writeln(myObject.getValue());// 6
        // 构造器调用模式
        var Quo=function(string){
            this.status=string;
        };
        Quo.prototype.get_status=function(){
            return this.status;
        };
        var myQuo=new Quo("confused");// 构造器函数
        document.writeln(myQuo.get_status());
        // apply调用模式
        var array=[3,4];
        var sum=add.apply(null,array);// sum值为7
        var statusObject={
            status:'A-OK'
        };
        var status=Quo.prototype.get_status.apply(statusObject);// stats值为'A-OK
        // arguments数组
        var sum1=function(){
            var i,sum=0;
            for(i=0;i<arguments.length;i+=1){
                sum+=arguments[i];
            }
            return sum;
        }
        document.writeln(sum1(4,8,15,16,23,42));// 108
        // 异常
        var adds=function(a,b){
            if(typeof a !== 'number' || typeof b !== 'number'){
                throw{
                    name:'TypeError',
                    message:'add needs numbers'
                };
            }
            return a+b;
        }
        var try_it=function(){
            try{
                add('seven');
            }catch(e){
                document.writeln(e.name+':'+e.message);
            }
        }
        try_it();
        // 给类型增加方法
        Function.prototype.method=function(name,func){
            this.prototype[name]=func;
            return this;
        }
        // 给number.prototype添加方法 提取整数
        Number.method('integer',function(){
            return Math[this<0?'ceiling':'floor'](this);
        });
        document.writeln((-10/3).integer());//3
        // 作用域
        var foo=function(){
            var a=3,b=5;
            var bar=function(){
            var b=7,c=11; 
            // a=3,b=7,c=11
            a+=b+c;
            // a=21,b=7,c=11
            };
            // a=3,b=5,c还没有定义
            bar();
            // a=21,b=5
        } 
        // 级联
        getElement('myBoxDiv').
            move(350,150).
            width(100);
        // 套用
        var add1=add.curry(1);
        document.writeln(add1(6));// 7
    </script>
</body>
</html>